#include "qutility.h"

QUtility::QUtility(QObject *parent)
    : QObject(parent)
    , qCrc(parent)
    , qDes(parent)
{

}

//F01：文件操作
//读文件最后一行
QByteArray QUtility::readLastLine(QFile &file)
{
    QTextStream in(&file);
    int len = file.size();
    QString str;
    bool lf = false;

    // 避开最后的换行符 \r\n
    while(len > 0)
    {
        len--;
        in.seek(len);
        str = in.read(1); // 位置会向后移一位
        if ((str.compare("\r") != 0) && (str.compare("\n") != 0))
            break;
    }

    while(len > 0)
    {
        len--;
        in.seek(len);
        if (in.read(1).compare("\n") == 0) // 位置会向后移一位
        {
            lf = true;
            break;
        }
    }
    // 如果是换行结束，则不重置位置
    if (lf != true)
        in.seek(len);

    in.setCodec("utf-8"); // 按utf8读取
    return in.readLine().toUtf8();
}
//获取文件编码 utf-8或gbk
QString QUtility::getFileCodec(QString &fileName, uint depth)
{
    QFile file(fileName);

    // 文本只读方式打开
    if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
    {
        return "";
    }

    /**
     * depth = 0： 全文件检查编码，直到文件的结束
     *       = 其他值： 指定的行数检查编码
     */
    uint count = depth;
    QByteArray bytes; // 一行的内容
    QTextCodec *codec = QTextCodec::codecForName("utf-8");
    QTextCodec::ConverterState state;
    QString ret("utf-8");

    // 没有读到文件末尾，并且判断指定的行数
    while(!file.atEnd()
          && ((depth == 0) || (count > 0)))
    {
        // readLine 读取一行
        bytes = file.readLine();

        // 检查 按 utf-8 转换成 Unicode 是否正确
        codec->toUnicode(bytes.constData(), bytes.size(), &state);
        if (state.invalidChars > 0)
        {
            ret = "gbk";
            break;
        }

        // 行计数减一
        if (count > 0)
        {
            count--;
        }
    }

    file.close();

    return ret;
};

//F02：计算CRC, 见QCrc类
//F03：DES加密算法，见QDes类
